package com.founder.cebxkit;

import java.util.ArrayList;

public class CEBXStructureDocWrapper {
	private long mhandle;
	private ArrayList<CxFlowSearchResult> arraySearchResults;
	private int mFindRetcode;
	private ArrayList<CxRect> arraySearchResultRects;
	
	// 查找结果
	public static final int XEK_FLOWSEARCH_SUCCESS = 1;
	public static final int XEK_FLOWSEARCH_NOMATCH = 2;
	public static final int XEK_FLOWSEARCH_END = 3;
	public static final int XEK_FLOWSEARCH_ERROR = 4;
	
	// SetUseDocumentFont使用
	public static final int XEK_DOCFONTSTYLEUSAGE_NONE		= 0;	// 不使用版式字体
	public static final int XEK_DOCFONTSTYLEUSAGE_FONTFACE	= 1;	// 使用版式字体
	public static final int XEK_DOCFONTSTYLEUSAGE_SIZE		= 2;	// 使用版式字号
	public static final int XEK_DOCFONTSTYLEUSAGE_ITALIC	= 4;	// 使用版式斜体样式，当设置XEK_DOCFONTSTYLEUSAGE_FONTFACE时有效
	public static final int XEK_DOCFONTSTYLEUSAGE_WEIGHT	= 8;	// 使用版式粗体样式，当设置XEK_DOCFONTSTYLEUSAGE_FONTFACE时有效
	public static final int XEK_DOCFONTSTYLEUSAGE_COLOR		= 16;	// 使用版式颜色
	public static final int XEK_DOCFONTSTYLEUSAGE_ALL		= 0xFFFFFFFF;	// 使用所有版式字体属性
	
	/**
	 * 构造函数，负责各种初始值。
	 * @return
	 */
	public CEBXStructureDocWrapper(long handle) {
		mhandle = handle;
		arraySearchResults = new ArrayList<CxFlowSearchResult>();
		mFindRetcode = XEK_FLOWSEARCH_ERROR;
		arraySearchResultRects = new ArrayList<CxRect>();
	}
	
	/**
	 * 绘制页面。
 	 * @param infodev		绘制目标信息
 	 * @param bitmap		绘制目标
 	 * @param option		绘制参数。
	 * @param result		绘制结果。
	 * @return
	 */
	public native boolean Render(CxBitmapInfoDev infodev, int[] bitmap, CxFlowRenderOption option, CxFlowRenderResult result);

	/**
	 * 获取上次绘制结果，指定行的显示区域及流式位置。
	 * @param row			行数，从0开始。
	 * @param rowRect		显示区域。
	 * @param flowpos		流式位置。
	 * @return				是否成功。
	 */
	public native boolean GetRowBounds(int row, CxRect rowRect, CxFlowPosition flowpos);

	/**
	 * 根据版式位置获取流式位置。
	 * @param fixedpos		版式位置。
	 * @param flowpos		流式位置。
	 * @return				是否成功。
	 */
	public native boolean GetFlowPosition(CxFixedPosition fixedpos, CxFlowPosition flowpos);

	/**
	 * 根据流式位置获取版式位置。
	 * @param flowpos		流式位置。
	 * @param fixedpos		版式位置。
	 * @return				是否成功。
	 */
	public native boolean GetFixedPosition(CxFlowPosition flowpos, CxFixedPosition fixedpos);
	
	/**
	 * 根据流式位置获取文字内容。
	 * @param flowposstart	流式起始位置。
	 * @param flowposend	流式终点位置。
	 * @return				文字内容。
	 */
	public native String GetTextContent(CxFlowPosition flowposstart, CxFlowPosition flowposend);
		
	/**
	 * 设置重排显示是否使用文档字体。
	 * @param bUseDocFont		是否使用文档字体。
	 * @return
	 */
	public native void SetUseDocumentFont(int nDocFontUsage);
	
	/**
	 * 修改文字显示颜色，用于黑夜模式。
	 * @param colorA			文字颜色 A。
	 * @param colorR			文字颜色 R。
	 * @param colorG			文字颜色 G。
	 * @param colorB			文字颜色 B。
	 * @return					是否成功。
	 */
	public native boolean SetTextColor(int colorA, int colorR, int colorG, int colorB);
	
	/**
	 * 修改其他Style属性。
	 * @param fontname		字体注册名。
	 * @param fontsize		字号。
	 * @param paraspacing	段间距。
	 * @param linecap		行间距。
	 * @return				是否成功。
	 */
	public native boolean SetStyles(String fontname, double fontsize, double paraspacing, double linecap);
	
	/**
	 * 修改段间距属性。
	 * @param paraSpacing	段间距。
	 */
	public native void SetParaSpacing(double paraSpacing);

	/**
	 * 修改段间距属性。
	 * @param linecap		行间距。
	 */
	public native void SetLineCap(double linecap);
	
	/**
	 * 恢复原始样式表。
	 * @return				是否成功。
	 */
	public native boolean ResetStyles();
	
	/**
	 * 绘制页面。
	 * @param pagenum				页码，从1开始
	 * @param option				查找参数
	 * @return						查找结果Array
	 */
	public ArrayList<CxFlowSearchResult> FindText(CxFlowPosition posSearch, CxSearchOption option) {
		switch (XEKFindText(posSearch, option))
		{
		case 0:
			mFindRetcode = XEK_FLOWSEARCH_SUCCESS;
			return arraySearchResults;
		case 1:
			mFindRetcode = XEK_FLOWSEARCH_NOMATCH;
			break;
		case 2:
			mFindRetcode = XEK_FLOWSEARCH_END;
			break;
		case 3:
			mFindRetcode = XEK_FLOWSEARCH_ERROR;
			break;
		default:
			mFindRetcode = XEK_FLOWSEARCH_ERROR;
			break;
		}
		return null;
	}
	
	public int GetLastFindRetcode() {
		return mFindRetcode;
	}
	
	public native int GetSearchResultRect(CxFlowPosition posStart, CxFlowPosition posEnd);
	public ArrayList<CxRect> GetResultRects() {
		return arraySearchResultRects;
	}
	
	private native int XEKFindText(CxFlowPosition posSearch, CxSearchOption option);
	
	private void AddSearchResult(CxFlowSearchResult result) {
		arraySearchResults.add(result);
	}
	
	public void ClearSearchResult() {
		arraySearchResults.clear();
	}
	
	private void AddSearchResultRect(CxRect rect) {
		arraySearchResultRects.add(rect);
	}
	
	public void ClearSearchResultRect() {
		arraySearchResultRects.clear();
	}
	
	public ArrayList<CxRect> GetSearchResultRects() {
		return arraySearchResultRects;
	}
}
